home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / board / IGNUChess151.lha / GNUChess-1.51 / editb.c < prev    next >
C/C++ Source or Header  |  1994-02-10  |  8KB  |  322 lines

  1. /************************************************************************/
  2. /* Edit position                                                        */
  3. /************************************************************************/
  4.  
  5. #include <graphics/gfx.h>
  6. #include <graphics/gfxmacros.h>
  7.  
  8. #include <intuition/intuition.h>
  9. #include <intuition/gadgetclass.h>
  10.  
  11. #include <libraries/gadtools.h>
  12.  
  13. #include <proto/exec.h>
  14. #include <proto/graphics.h>
  15. #include <proto/intuition.h>
  16. #include <proto/gadtools.h>
  17.  
  18. #include <clib/macros.h>
  19.  
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23.  
  24. #include "global.h"
  25. #include "gfx.h"
  26. #include "gnuchess.h"
  27. #include "Proto.h"
  28. #include "Interface.h"
  29.  
  30. extern short PieceList[2][16];
  31.  
  32. static int WIsCheck(void);
  33. static int SIsCheck(void);
  34. static int ValidBoard(void);
  35.  
  36. static struct Window    *v;
  37. static struct RastPort    *rpv;
  38. static int                WhoBegins, StartZugNr;
  39.  
  40.  
  41. int MFeld(struct IntuiMessage *msg, int *index)
  42. {
  43.     int r, c;
  44.     
  45.     if ( (MOUSEX(msg) < XOFF) || (MOUSEY(msg) > YOFF) )
  46.         return FALSE; 
  47.     c = (MOUSEX(msg) - XOFF) / FELDBREITE;
  48.     r = (YOFF - MOUSEY(msg)) / FELDHOEHE;
  49.     if ( reverse ) {
  50.         c = _H - c;
  51.         r = _8 - r;
  52.     }
  53.     if ( (c >= _A) && (c <= _H) && (r >= _1) && (r <= _8) ) {
  54.         *index = locn[r][c];
  55.         return TRUE;
  56.     }
  57.     return FALSE;
  58. }
  59.  
  60. static int WIsCheck(void)
  61. {
  62.     int i;
  63.  
  64.     for ( i = 0; i < 64; i++ )
  65.         if ( ( board[i] == king ) && ( color[i] == white ) )
  66.             return SqAtakd(i, black);
  67.     return TRUE;
  68. }
  69.  
  70. static int SIsCheck(void)
  71. {
  72.     int i;
  73.  
  74.     for ( i = 0; i < 64; i++ )
  75.         if ( ( board[i] == king ) && ( color[i] == black ) )
  76.             return SqAtakd(i, white);
  77.     return TRUE;
  78. }
  79.  
  80. static int ValidBoard(void)
  81. {
  82.     int    i, umw,
  83.         wk = 0, wd = 0, wt = 0, wlwf = 0, wlsf = 0, ws = 0, wb = 0,
  84.         sk = 0, sd = 0, st = 0, slwf = 0, slsf = 0, ss = 0, sb = 0;
  85.  
  86.     for ( i = 0; i < 64; i++ ) {
  87.         switch ( board[i] ) {
  88.                 case king  : if ( color[i] == white ) wk++; else sk++; break;
  89.                 case queen : if ( color[i] == white ) wd++; else sd++; break;
  90.                 case rook  : if ( color[i] == white ) wt++; else st++; break;
  91.                 case knight: if ( color[i] == white ) ws++; else ss++; break;
  92.                 case pawn  : if ( color[i] == white ) wb++; else sb++; break;
  93.                  case bishop:
  94.                     if ( FCOLOR(i / 8, i % 8) == COLOR_WFELD )
  95.                         if ( color[i] == white ) wlwf++; else slwf++;
  96.                     else
  97.                         if ( color[i] == white ) wlsf++; else slsf++;
  98.                     break;
  99.         }
  100.     }
  101.     if ( (wk != 1) || (sk != 1) || (wb > 8) || (sb > 8) ) return FALSE;
  102.     umw =    MAX(0, wd    - 1) +
  103.             MAX(0, wt    - 2) +
  104.             MAX(0, wlwf    - 1) +
  105.             MAX(0, wlsf    - 1) +
  106.             MAX(0, ws    - 2);
  107.     if ( ( 8 - wb ) < umw ) return FALSE;
  108.     umw =    MAX(0, sd    - 1) +
  109.             MAX(0, st    - 2) +
  110.             MAX(0, slwf    - 1) +
  111.             MAX(0, slsf    - 1) +
  112.             MAX(0, ss    - 2);
  113.     if ( ( 8 - sb ) < umw ) return FALSE;
  114.  
  115.     if ( (WhoBegins == WHITE) && SIsCheck() ) return FALSE;
  116.     if ( (WhoBegins == BLACK) && WIsCheck() ) return FALSE;
  117.  
  118.     for ( i =  0; i <=  7; i++ )
  119.         if ( board[i] == pawn ) return FALSE;
  120.     for ( i = 56; i <= 63; i++ )
  121.         if ( board[i] == pawn ) return FALSE;
  122.  
  123.     return TRUE;
  124. }
  125.  
  126. void EditBoard(void)
  127. {
  128.     int                    i, quit = FALSE;
  129.     struct IntuiMessage    *msg;
  130.     int                    Sel;
  131.     struct Gadget        *SelG;
  132.     int                    sq;
  133.     short                saved_board[64],
  134.                         saved_color[64];
  135.  
  136.     ClearMessage();
  137.  
  138.     v = OpenWindowTags(
  139.         NULL,
  140.         WA_Left,            NX1 - 2,
  141.         WA_Top,                NY1 - 2,
  142.         WA_Width,            NX2 - NX1 + 5,
  143.         WA_Height,            TY2 - NY1 + 5,
  144.         WA_DetailPen,        COLOR_TXTFGR,
  145.         WA_BlockPen,        COLOR_BLOCK,
  146.         WA_IDCMP,            IDCMP_GADGETUP,
  147.         WA_CustomScreen,    s,
  148.         WA_SizeGadget,        FALSE,
  149.         WA_DragBar,            FALSE,
  150.         WA_AutoAdjust,        TRUE,
  151.         WA_Borderless,        TRUE,
  152.         WA_NoCareRefresh,    TRUE,
  153.         TAG_DONE
  154.     );
  155.     if ( ! v ) return;
  156.  
  157.     AddGList(v, EdB_GL , -1, -1, NULL);
  158.     AddGList(v, EdB_GL2, -1, -1, NULL);
  159.  
  160.     ClearMenuStrip(w);
  161.  
  162.     rpv = v->RPort;
  163.  
  164.     SetRast(rpv, COLOR_REQBCK);
  165.  
  166.     DrawBevelBox(
  167.         rpv,
  168.         0,            1,
  169.         NX2 - NX1 + 5,        TY2 - NY1 + 3,
  170.         GT_VisualInfo,        vi,
  171.         TAG_DONE
  172.     );
  173.     DrawBevelBox(
  174.         rpv,
  175.         0,            0,
  176.         NX2 - NX1 + 5,        TY2 - NY1 + 5,
  177.         GT_VisualInfo,        vi,
  178.         TAG_DONE
  179.     );
  180.  
  181.     SetAPen(rpv, COLOR_RAHMEN);
  182.     for ( i = 0; i <= 2; i++ ) {
  183.         Move(rpv,   6+i*50,   6);
  184.         Draw(rpv,   6+i*50, 306);
  185.         Move(rpv,   7+i*50,   6);
  186.         Draw(rpv,   7+i*50, 306);
  187.     }
  188.     for ( i = 0; i <= 6; i++ ) {
  189.         Move(rpv,   6, 6+i*50);
  190.         Draw(rpv, 106, 6+i*50);
  191.         Move(rpv,   6, 7+i*50);
  192.         Draw(rpv, 106, 7+i*50);
  193.     }
  194.  
  195.     Sel  = GAD_WB;
  196.     SelG = EdB_GL;
  197.  
  198.     GT_SetGadgetAttrs(GAD_ToMove , v, NULL, GTCY_Active, 0, TAG_DONE);
  199.     GT_SetGadgetAttrs(GAD_MoveNum, v, NULL, GTIN_Number, 1, TAG_DONE);
  200.  
  201.     RefreshGadgets(EdB_GL, v, NULL);
  202.     GT_RefreshWindow(v, NULL);
  203.  
  204.     memcpy(saved_board, board, 64 * sizeof(short));
  205.     memcpy(saved_color, color, 64 * sizeof(short));
  206.  
  207.     while ( ! quit ) {
  208.         if ( ValidBoard() )
  209.             GT_SetGadgetAttrs(GAD_Ok, v, NULL, GA_Disabled, FALSE, TAG_DONE);
  210.         else
  211.             GT_SetGadgetAttrs(GAD_Ok, v, NULL, GA_Disabled, TRUE , TAG_DONE);
  212.  
  213.         while ( TRUE ) {
  214.             if ( msg = GT_GetIMsg(v->UserPort) ) break;
  215.             if ( msg = GT_GetIMsg(w->UserPort) ) break;
  216.             Wait((1 << v->UserPort->mp_SigBit) | (1 << w->UserPort->mp_SigBit));
  217.             if ( msg = GT_GetIMsg(v->UserPort) ) break;
  218.             if ( msg = GT_GetIMsg(w->UserPort) ) break;
  219.         }
  220.         switch ( CLASS(msg) ) {
  221.             case IDCMP_MOUSEBUTTONS:
  222.                 if ( ( CODE(msg) & IECODE_UP_PREFIX ) && MFeld(msg, &sq) ) {
  223.                     if ( board[sq] == no_piece ) {
  224.                         switch ( Sel ) {
  225.                             case GAD_WB: board[sq] = pawn  ; color[sq] = white; break;
  226.                             case GAD_SB: board[sq] = pawn  ; color[sq] = black; break;
  227.                             case GAD_WS: board[sq] = knight; color[sq] = white; break;
  228.                             case GAD_SS: board[sq] = knight; color[sq] = black; break;
  229.                             case GAD_WL: board[sq] = bishop; color[sq] = white; break;
  230.                             case GAD_SL: board[sq] = bishop; color[sq] = black; break;
  231.                             case GAD_WT: board[sq] = rook  ; color[sq] = white; break;
  232.                             case GAD_ST: board[sq] = rook  ; color[sq] = black; break;
  233.                             case GAD_WD: board[sq] = queen ; color[sq] = white; break;
  234.                             case GAD_SD: board[sq] = queen ; color[sq] = black; break;
  235.                             case GAD_WK: board[sq] = king  ; color[sq] = white; break;
  236.                             case GAD_SK: board[sq] = king  ; color[sq] = black; break;
  237.                         }
  238.                     }
  239.                     else {
  240.                         board[sq] = no_piece; color[sq] = neutral;
  241.                     }
  242.                     DrawPiece(sq);
  243.                     Book = NULL;
  244.                 }
  245.                 break;
  246.             case IDCMP_REFRESHWINDOW:
  247.                 GT_BeginRefresh(msg->IDCMPWindow);
  248.                 GT_EndRefresh(msg->IDCMPWindow, TRUE);
  249.                 break;
  250.             case IDCMP_GADGETUP:
  251.                 switch ( GADGETID(msg) ) {
  252.                     case GAD_WB:
  253.                     case GAD_SB:
  254.                     case GAD_WT:
  255.                     case GAD_ST:
  256.                     case GAD_WS:
  257.                     case GAD_SS:
  258.                     case GAD_WL:
  259.                     case GAD_SL:
  260.                     case GAD_WD:
  261.                     case GAD_SD:
  262.                     case GAD_WK:
  263.                     case GAD_SK:
  264.                         if ( Sel != GADGETID(msg) ) {
  265.                             Sel = GADGETID(msg);
  266.                             SelG->Flags &= ~GFLG_SELECTED;
  267.                             RefreshGList(SelG, v, NULL, 1);
  268.                             SelG = GADGET(msg);
  269.                         }
  270.                         SelG->Flags |=  GFLG_SELECTED;
  271.                         RefreshGList(SelG, v, NULL, 1);
  272.                         break;
  273.                     case GAD_CLEAR:
  274.                         for ( sq = 0; sq < 64; sq++ ) {
  275.                             board[sq] = no_piece; color[sq] = neutral;
  276.                         }
  277.                         Book = NULL;
  278.                         UpdateDisplay(0,0,1,0);
  279.                         break;
  280.                     case GAD_DEFAULT:
  281.                         GT_SetGadgetAttrs(GAD_ToMove , v, NULL, GTCY_Active, 0, TAG_DONE);
  282.                         GT_SetGadgetAttrs(GAD_MoveNum, v, NULL, GTIN_Number, 1, TAG_DONE);
  283.                         for ( sq = 0; sq < 64; sq++ ) {
  284.                             board[sq] = Stboard[sq]; color[sq] = Stcolor[sq];
  285.                         }
  286.                         UpdateDisplay(0, 0, 1, 0);
  287.                         if ( ! Book ) GetOpenings();
  288.                         break;
  289.                     case GAD_OK:
  290.                         quit = TRUE;
  291.                         mate = false;
  292.                         StartZugNr = GADGETINT(GAD_MoveNum);
  293.                         kingmoved[white] = (board[ 4] != king) ? 10 : 0;
  294.                         kingmoved[black] = (board[60] != king) ? 10 : 0;
  295.                         GameCnt = -1; Game50 = 0; Sdepth = 0;
  296.                         InitializeStats();
  297.                         UpdateDisplay(0, 0, 1, 0);
  298.                         break;
  299.                     case GAD_MOVENUM:
  300.                         break;
  301.                     case GAD_TOMOVE:
  302.                         WhoBegins = (WhoBegins == WHITE) ? BLACK : WHITE;
  303.                         break;
  304.                     default:
  305.                         break;
  306.                 }
  307.                 break;
  308.             default:
  309.                 break;                
  310.         }
  311.         GT_ReplyIMsg(msg);
  312.     }
  313.  
  314.     RemoveGList(v, EdB_GL2, -1);
  315.     CloseWindow(v);
  316.     SelG->Flags &= ~GFLG_SELECTED;
  317.     SelG = EdB_GL;
  318.     SelG->Flags |=  GFLG_SELECTED;
  319.  
  320.     if ( ! ResetMenuStrip(w, Menu) ) ExitChess(10);
  321. }
  322.